  #include <time.h>
  #include <stdio.h>
  #include <fcntl.h>
  #include <unistd.h>
  #include <stdlib.h>
  #include <string.h>
  #include <dirent.h>
  #include <sys/stat.h>
  #include <sys/wait.h>
  #include <sys/types.h>
  #include "sistema.h"
  #include "arquivos.h"
      
      char path[100];
      //Variável que recebe o dir2 passado pelo utilizador
      char source[50];
      //Variável que recebe o dir3 passado pelo utilizador
      char destino[50];
      //Método que apresenta os Restores disponíveis
      void available_restore(char * diret)
      {
      struct dirent *entry;
      char *directories[1000];
      int count_dir = 0;
      char filename[512];
      //Abre o diretório passado como argumento na chamada da função Restore
      DIR *dir = opendir(diret);
      if(dir != NULL)
      {
      while((entry = readdir(dir)) != NULL)
      {
      //Estrutura que permite verificar se a entrada de leitura é um diretório
      struct stat st;
      //Coloca em path o caminho da pasta de restores para uso futuro
      sprintf(path, "%s/", diret);
      //Coloca em filename o name do diretorio em que se encontra
      sprintf(filename, "%s", entry->d_name);
      stat(filename, &st);
      //Verifica se é um diretório
      if(S_ISDIR(st.st_mode))
      {
      //Elimina as situações de "." e ".." presentes em todos os diretórios
      if((strcmp(entry->d_name, ".") != 0) && (strcmp(entry->d_name, "..") != 0))
	{
      //Coloca o diretório em que se encontra no array directories
      directories[count_dir] = malloc(strlen(filename)+1);
      strcpy(directories[count_dir], filename);    
      //Aumenta o contador de diretórios
      count_dir ++;	
	}  
	}
      }
      closedir(dir);	
      //Imprime o array de diretórios
      printf("%s\n", "List of available restore points:");
      int i = 0;
      for(i = 0; i < count_dir; i ++)
      printf("%-25s\n",directories[i]);

      }
      }

      //Método que restora os ficheiros
      void restore_files(char* p)
      {
      //Esta função apresenta "duas partes" devido unicamente à chamada strtok, que exige primeiramente receber strtok(Apontador, condição de terminação) e nas chamadas seguintes exige strtok(NULL, condição de terminação)
      //Apontadores data_temp serve como "variável" para ir sendo atualizada à medida que se percorre o bck_info
      char *data_temp;  
      //Apontador ficheiro_temp
      char *ficheiro_temp;
      //Apontador que vai receber o caminho do arquivo a ser copiado
      char *caminho;
      //Condição de terminação de strtok
      char delims[3] = "\n";
      //Lê 1ª linha para ficheiro, caso não seja NULL obrigatoriamente irá ter uma segunda linha com a data de modificação
      ficheiro_temp = strtok( p, delims );
      //Caso o ficheiro esteja vazio - exit
      if(ficheiro_temp == NULL)
	 exit(0);  
	    else {
      //Lê a segunda linha do bckp_info para o apontador apenas com o intuito de manter a ordem de leitura 
      data_temp = strtok( NULL, delims );
      //Aloca memória para o path do Arquivo que vai ser copiado
      caminho = malloc(strlen(ficheiro_temp)+1);
      //Copia o path do arquivo para o apontador caminho
      strcpy(caminho, ficheiro_temp);
      //Função que copia os ficheiros
      ARQUIVOS_copia(caminho, destino);
      }
      //Enquanto não chegar ao fim do ficheiro continua a ler
      while (ficheiro_temp != NULL)
      {
      //Verifica mais uma vez se ficheiro_temp é NULL, e caso não o seja, procede mais uma vez à cópia do ficheiro
      ficheiro_temp = strtok( NULL, delims );
      if(ficheiro_temp == NULL)
      break;
      //Lê mais uma vez para o apontador data_temp para manter a ordem de leitura
      data_temp = strtok( NULL, delims );
      //Aloca memória para o path do Arquivo que vai ser copiado
      caminho = malloc(strlen(ficheiro_temp)+1);
      //Copia o path do arquivo para o apontador caminho
      strcpy(caminho, ficheiro_temp);
      //Chamada à função que copia o ficheiro com path caminho para o destino 
      ARQUIVOS_copia(caminho, destino);     
      }	    
      
    }
  
  int main (int argc, char *argv[])
  {
      
      //variável que vai receber o input do utilizador, na altura de escolher o diretorio de que se quer fazer restore
      char dir_escolhido[50];
      //Copia o dir2 passado para a variável destino
      strcpy(destino, argv[2]);
      //Copia o dir1 passado ao programa na altura da chamada do "rstr" para a variável source
      strcpy(source, argv[1]);
      //Método que apresenta os Restores disponíveis
      available_restore(source);
      //Variável que fica com o path do dir1
      char caminho[1000];
      //Coloca o "path" do diretorio passado em argv[1] em caminho
      strcpy(caminho, path);
      printf("%s\n", "Which restore point (time) ?");
      scanf("%s", dir_escolhido);
      //Coloca em caminho o "path" completo do diretorio do qual desejamos fazer restore
      sprintf(caminho, "./%s/%s", path, dir_escolhido);
      //Apontador que retorna o bckpinfo do diretorio escolhido
      char *p;
      //Retorna o bckp_info do diretorio
      p = SISTEMA_retbckinfo(caminho);
      //String que recebe a resposta do utilizador
      char answer[10];
      printf("Do you want to restore all of the files ? (yes/no)");
      //Em caso afirmativo chama a função que restora os ficheiros
      scanf("%s",answer);
      if((strcmp(answer, "yes") == 0))
      //Método que faz restore dos ficheiros para a pasta de destino
      restore_files(p);	
	exit(0);    
  }

